home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / blowfish / asm / x86unix.pl < prev   
Perl Script  |  2000-05-18  |  5KB  |  314 lines

  1. #!/usr/local/bin/perl
  2.  
  3. package x86ms;
  4.  
  5. $label="L000";
  6.  
  7. $align=($main'aout)?"4":"16";
  8. $under=($main'aout)?"_":"";
  9. $com_start=($main'sol)?"/":"#";
  10.  
  11. if ($main'cpp)
  12.     {
  13.     $align="ALIGN";
  14.     $under="";
  15.     $com_start='/*';
  16.     $com_end='*/';
  17.     }
  18.  
  19. %lb=(    'eax',    '%al',
  20.     'ebx',    '%bl',
  21.     'ecx',    '%cl',
  22.     'edx',    '%dl',
  23.     'ax',    '%al',
  24.     'bx',    '%bl',
  25.     'cx',    '%cl',
  26.     'dx',    '%dl',
  27.     );
  28.  
  29. %hb=(    'eax',    '%ah',
  30.     'ebx',    '%bh',
  31.     'ecx',    '%ch',
  32.     'edx',    '%dh',
  33.     'ax',    '%ah',
  34.     'bx',    '%bh',
  35.     'cx',    '%ch',
  36.     'dx',    '%dh',
  37.     );
  38.  
  39. %regs=(    'eax',    '%eax',
  40.     'ebx',    '%ebx',
  41.     'ecx',    '%ecx',
  42.     'edx',    '%edx',
  43.     'esi',    '%esi',
  44.     'edi',    '%edi',
  45.     'ebp',    '%ebp',
  46.     'esp',    '%esp',
  47.     );
  48.  
  49. sub main'LB
  50.     {
  51.     (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
  52.     return($lb{$_[0]});
  53.     }
  54.  
  55. sub main'HB
  56.     {
  57.     (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
  58.     return($hb{$_[0]});
  59.     }
  60.  
  61. sub main'DWP
  62.     {
  63.     local($addr,$reg1,$reg2,$idx)=@_;
  64.  
  65.  
  66.     $ret="";
  67.  
  68.     $addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
  69.  
  70.     $reg1="$regs{$reg1}" if defined($regs{$reg1});
  71.     $reg2="$regs{$reg2}" if defined($regs{$reg2});
  72.     $ret.=$addr if ($addr ne "") && ($addr ne 0);
  73.     if ($reg2 ne "")
  74.         {
  75.         $ret.="($reg1,$reg2,$idx)";
  76.         }
  77.     else
  78.         {
  79.         $ret.="($reg1)"
  80.         }
  81.     return($ret);
  82.     }
  83.  
  84. sub main'BP
  85.     {
  86.     local($addr,$reg1,$reg2,$idx)=@_;
  87.  
  88.  
  89.     $ret="";
  90.  
  91.     $addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
  92.  
  93.     $reg1="$regs{$reg1}" if defined($regs{$reg1});
  94.     $reg2="$regs{$reg2}" if defined($regs{$reg2});
  95.     $ret.=$addr if ($addr ne "") && ($addr ne 0);
  96.     if ($reg2 ne "")
  97.         {
  98.         $ret.="($reg1,$reg2,$idx)";
  99.         }
  100.     else
  101.         {
  102.         $ret.="($reg1)"
  103.         }
  104.     return($ret);
  105.     }
  106.  
  107. sub main'mov    { &out2("movl",@_); }
  108. sub main'movb    { &out2("movb",@_); }
  109. sub main'and    { &out2("andl",@_); }
  110. sub main'or    { &out2("orl",@_); }
  111. sub main'shl    { &out2("sall",@_); }
  112. sub main'shr    { &out2("shrl",@_); }
  113. sub main'xor    { &out2("xorl",@_); }
  114. sub main'add    { &out2("addl",@_); }
  115. sub main'sub    { &out2("subl",@_); }
  116. sub main'rotl    { &out2("roll",@_); }
  117. sub main'rotr    { &out2("rorl",@_); }
  118. sub main'exch    { &out2("xchg",@_); }
  119. sub main'cmp    { &out2("cmpl",@_); }
  120. sub main'jmp    { &out1("jmp",@_); }
  121. sub main'je    { &out1("je",@_); }
  122. sub main'jne    { &out1("jne",@_); }
  123. sub main'jnz    { &out1("jnz",@_); }
  124. sub main'jz    { &out1("jz",@_); }
  125. sub main'dec    { &out1("decl",@_); }
  126. sub main'push    { &out1("pushl",@_); }
  127. sub main'call    { &out1("call",$under.$_[0]); }
  128.  
  129.  
  130. sub out2
  131.     {
  132.     local($name,$p1,$p2)=@_;
  133.     local($l,$ll,$t);
  134.  
  135.     print "\t$name\t";
  136.     $t=&conv($p2).",";
  137.     $l=length($t);
  138.     print $t;
  139.     $ll=4-($l+9)/8;
  140.     print "\t" x $ll;
  141.     print &conv($p1);
  142.     print "\n";
  143.     }
  144.  
  145. sub out1
  146.     {
  147.     local($name,$p1)=@_;
  148.     local($l,$t);
  149.  
  150.     print "\t$name\t";
  151.     print &conv($p1);
  152.     print "\n";
  153.     }
  154.  
  155. sub conv
  156.     {
  157.     local($p)=@_;
  158.  
  159. #    $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
  160.  
  161.     $p=$regs{$p} if (defined($regs{$p}));
  162.  
  163.     $p =~ s/^([0-9A-Fa-f]+)$/\$$1/;
  164.     $p =~ s/^(0x[0-9A-Fa-f]+)$/\$$1/;
  165.     return $p;
  166.     }
  167.  
  168. sub main'file
  169.     {
  170.     local($file)=@_;
  171.  
  172.     print <<"EOF";
  173.     .file    "$file.s"
  174.     .version    "01.01"
  175. gcc2_compiled.:
  176. EOF
  177.     }
  178.  
  179. sub main'function_begin
  180.     {
  181.     local($func,$num)=@_;
  182.  
  183.     $params=$num*4;
  184.  
  185.     $func=$under.$func;
  186.  
  187.     print <<"EOF";
  188. .text
  189.     .align $align
  190. .globl $func
  191. EOF
  192.     if ($main'cpp)
  193.         { printf("\tTYPE($func,\@function)\n"); }
  194.     else    { printf("\t.type    $func,\@function\n"); }
  195.     print <<"EOF";
  196. $func:
  197.     pushl    %ebp
  198.     pushl    %ebx
  199.     pushl    %esi
  200.     pushl    %edi
  201.  
  202. EOF
  203.     $stack=20;
  204.     }
  205.  
  206. sub main'function_end
  207.     {
  208.     local($func)=@_;
  209.  
  210.     $func=$under.$func;
  211.  
  212.     print <<"EOF";
  213.     popl    %edi
  214.     popl    %esi
  215.     popl    %ebx
  216.     popl    %ebp
  217.     ret
  218. .${func}_end:
  219. EOF
  220.     if ($main'cpp)
  221.         { printf("\tSIZE($func,.${func}_end-$func)\n"); }
  222.     else    { printf("\t.size\t$func,.${func}_end-$func\n"); }
  223.     print ".ident    \"desasm.pl\"\n";
  224.     $stack=0;
  225.     %label=();
  226.     }
  227.  
  228. sub main'function_end_A
  229.     {
  230.     local($func)=@_;
  231.  
  232.     print <<"EOF";
  233.     popl    %edi
  234.     popl    %esi
  235.     popl    %ebx
  236.     popl    %ebp
  237.     ret
  238. EOF
  239.     }
  240.  
  241. sub main'function_end_B
  242.     {
  243.     local($func)=@_;
  244.  
  245.     $func=$under.$func;
  246.  
  247.     print <<"EOF";
  248. .${func}_end:
  249. EOF
  250.     if ($main'cpp)
  251.         { printf("\tSIZE($func,.${func}_end-$func)\n"); }
  252.     else    { printf("\t.size\t$func,.${func}_end-$func\n"); }
  253.     print ".ident    \"desasm.pl\"\n";
  254.     $stack=0;
  255.     %label=();
  256.     }
  257.  
  258. sub main'wparam
  259.     {
  260.     local($num)=@_;
  261.  
  262.     return(&main'DWP($stack+$num*4,"esp","",0));
  263.     }
  264.  
  265. sub main'wtmp_b
  266.     {
  267.     local($num,$b)=@_;
  268.  
  269.     return(&main'BP(-(($num+1)*4)+$b,"esp","",0));
  270.     }
  271.  
  272. sub main'wtmp
  273.     {
  274.     local($num)=@_;
  275.  
  276.     return(&main'DWP(-($num+1)*4,"esp","",0));
  277.     }
  278.  
  279. sub main'comment
  280.     {
  281.     foreach (@_)
  282.         {
  283.         if (/^\s*$/)
  284.             { print "\n"; }
  285.         else
  286.             { print "\t$com_start $_ $com_end\n"; }
  287.         }
  288.     }
  289.  
  290. sub main'label
  291.     {
  292.     if (!defined($label{$_[0]}))
  293.         {
  294.         $label{$_[0]}=".${label}${_[0]}";
  295.         $label++;
  296.         }
  297.     return($label{$_[0]});
  298.     }
  299.  
  300. sub main'set_label
  301.     {
  302.     if (!defined($label{$_[0]}))
  303.         {
  304.         $label{$_[0]}=".${label}${_[0]}";
  305.         $label++;
  306.         }
  307.     print ".align $align\n";
  308.     print "$label{$_[0]}:\n";
  309.     }
  310.  
  311. sub main'file_end
  312.     {
  313.     }
  314.